function [save_now,error] = problem3_2(process,change,speed,wash,tool)
%条件三 两道工序 有故障 

change=repmat(change,1,4);


pos=1;
time_remaining=zeros(1,8);%八个CNC完成当前工作剩余时间
state=zeros(1,8);%记录CNC当前状态 工作或空闲
t=0;
expect_t=ones(4,8);%预计时间 分别为预计移动时间 预计等待时间 预计上下件时间 三者和
save_now=[];%保存结果
error=[];%保存故障情况 每列为 故障时的物料序号 故障CNC编号	故障开始时间	故障结束时间 故障是否解决
        
goal=1;

while t<=28800
            for i=1:size(error,1)%更新故障情况
                    if t>=error(i,3)&&t<=error(i,4)&&error(i,5)==0
                            error(i,5)=1;%故障已经解决
                            time_remaining(error(i,2))=error(i,4)-t;
                            state(error(i,2))=0;
                    end
            end
           
            
            for i=1:8%计算预计时间
                if goal~=tool(i)
                    expect_t(:,i)=inf;
                    continue;
                end
                expect_t(1,i)=speed(1+abs(pos-ceil(i/2)));
                expect_t(2,i)=time_remaining(i);
                expect_t(3,i)=change(i);
                expect_t(4,i)=sum(expect_t(1:3,i));
            end

            
            %% 移动
            %寻找当前工序的下一个目标位置，并移动至该位置
            [~,min_num]=min(expect_t(4,:));
            t=t+expect_t(1,min_num);
            
            flag=0;
            for i=1:size(error,1)%移动后检查CNC工作情况
                if t>=error(i,3) && t<=error(i,4) &&error(i,5)==0 && min_num==error(i,2)%移动途中原CNC损坏
                    error(i,5)=1;
                    state(error(i,2))=0;
                    
                    %更新CNC时间
                    for j=1:8
                        if time_remaining(j)-expect_t(1,min_num)<0
                            time_remaining(j)=0;
                        else
                            time_remaining(j)=time_remaining(j)-expect_t(1,min_num);
                        end
                    end
                    
                    time_remaining(error(i,2))=error(i,4)-t; %当前工作剩余时间是故障修复的时间
                
                    flag=1;
                end
            end
            
            %如果发生故障 则结束本次循环 重新判断
            if flag==1
                continue;
            end
            
            %% 等待
            flag=0;
            for i=1:size(error,1)
                if t<=error(i,3) && t+expect_t(2,min_num)>=error(i,3) && error(i,5)==0 && error(i,2)==min_num %等待过程中原工件损坏
                    error(i,5)=1;
                    state(error(i,2))=0;
                    
                    %更新CNC时间
                    for j=1:8
                        if time_remaining(j)-(error(i,3)-t)<0
                            time_remaining(j)=0;
                        else
                            time_remaining(j)=time_remaining(j)-(error(i,3)-t);
                        end
                    end
                    time_remaining(error(i,2))=error(i,4)-error(i,3);% 等待时间为故障修复时间
                    t=error(i,3);
                    flag=1;
                end
            end
            
            if flag==1
                continue;
            end
            
            t=t+expect_t(2,min_num);%正常完成等待
            
            %% 上下料
            if goal==1% 目标为工序一
                flag=0;
                for k=size(save_now,1):-1:1
                    if save_now(k,1)==min_num && isnan(save_now(k,3))%即上料又下料
                        flag=1;
                        save_now(k,3)=t;%记录下料时间
                        save_now(end+1,1)=min_num;
                        save_now(end,2)=t;
                        save_now(end,3:6)=NaN;%工序二的记录矩阵
                        break;
                    end
                end
            
            
                if flag==0%只上料
                    save_now(end+1,1)=min_num;
                    save_now(end,2)=t;
                    save_now(end,3:6)=NaN;
                end

                if state(min_num)==1% 取下一个完成工序1的工件
                    goal=2;
                    Next=k;
                end

                state(min_num)=1;
                t=t+expect_t(3,min_num);

                %更新CNC时间
                for k=1:8
                    if time_remaining(k)-expect_t(4,min_num)<0
                        time_remaining(k)=0;
                    else
                        time_remaining(k)=time_remaining(k)-expect_t(4,min_num);
                    end
                end
                time_remaining(min_num)=process(1);

                if unifrnd(0,100)>=99%
                        start_t=t+unifrnd(0,process(1));% 在任意加工时间内开始出现故障
                        repair_t=unifrnd(600,1200);%故障修复时间随机
                        error=[error;size(save_now,1),min_num,start_t,start_t+repair_t,0];%保存故障记录
                end
                
                
            else%目标为工序二
                flag=0;
                for k=size(save_now,1):-1:1
                    if save_now(k,4)==min_num && isnan(save_now(k,6))%即上料又下料
                        flag=1;
                        save_now(k,6)=t;%记录下料时间
                        save_now(Next,4)=min_num;
                        save_now(Next,5)=t;
                        break;
                    end
                end
                
                if flag==0%上料 需要工序二的工件
                        save_now(Next,4)=min_num;
                        save_now(Next,5)=t;
                end
                
                goal=1;
                state(min_num)=1;
                
                t=t+expect_t(3,min_num)+wash;
                
                %更新CNC时间
                for j=1:8
                    if time_remaining(j)-expect_t(4,min_num)-wash<0
                        time_remaining(j)=0;
                    else
                        time_remaining(j)=time_remaining(j)-expect_t(4,min_num)-wash;
                    end
                end
                
                time_remaining(min_num)=process(2)-wash;
                
                if unifrnd(0,100)>=99%
                    start_t=t-wash+unifrnd(0,process(2));% 在任意加工时间内开始出现故障
                    repair_t=unifrnd(600,1200);%故障修复时间随机
                    error=[error;Next,min_num,start_t,start_t+repair_t,0];%保存故障记录
                end
            end
            pos=ceil(pos/2);%更新位置
end
end

